package com.xiyuan.smartutils.constants;


import java.util.regex.Pattern;

/**
 * 正则表达式常量定义
 *
 * @version v1.0.0 @author lgz 2017-8-27 新建与整理
 */

@SuppressWarnings({"DanglingJavadoc", "UnnecessaryUnicodeEscape", "SpellCheckingInspection"})
public interface RegexpConstants
{
    /** 需要转义的字符 */
    public static final String ESCAPE                       = "*.?+$^[](){}|\\/";
    
    /*********************************************************************************************************************************************/
    //数字相关
    /*********************************************************************************************************************************************/
    
    /** 数字，至少1位 */
    public static final Pattern NUMERIC                      = Pattern.compile("^\\d+$");

    /** 整数，支持正负数 */
    public static final Pattern INTEGER                      = Pattern.compile("^(0|[+\\-]?[1-9]\\d*)$");

    /** 正整数，第一个数字是1-9 */
    public static final Pattern INTEGER_P                    = Pattern.compile("^[1-9]\\d*$");

    /** 负整数，负号之后第一个数字是1-9 */
    public static final Pattern INTEGER_N                    = Pattern.compile("^-[1-9]\\d*$");

    /** 非负整数，0或者正整数 */
    public static final Pattern INTEGER_N_N                  = Pattern.compile("^(0|[1-9]\\d*)$");

    /** 非正整数，0或者负整数 */
    public static final Pattern INTEGER_N_P                  = Pattern.compile("^(0|-[1-9]\\d*)$");

    /** 浮点值，支持多位小数 */
    public static final Pattern FLOAT_INT                    = Pattern.compile("^(0|[1-9]\\d*)(\\.\\d+)?$");

    /** 浮点值，支持多位小数点，支持正负数 */
    public static final Pattern FLOAT                        = Pattern.compile("^(0|[+\\-]?[1-9]\\d*)(\\.\\d+)?$");

    /** 标准元金额，支持0-2位小数 */
    public static final Pattern AMOUNT_INT_2R                = Pattern.compile("^(0|[1-9]\\d*)(\\.\\d{1,2})?$");

    /** 固定元金额，两位小数 */
    public static final Pattern AMOUNT_INT_2R_FIXED          = Pattern.compile("^(0|[1-9]\\d*)(\\.\\d{2})$");

    /** 标准元金额，支持0-2位小数，支持正负数 */
    public static final Pattern AMOUNT_2R                    = Pattern.compile("^(0|[+\\-]?[1-9]\\d*)(\\.\\d{1,2})?$");

    /** 固定元金额，两位小数，支持正负数 */
    public static final Pattern AMOUNT_2R_FIXED              = Pattern.compile("^(0|[+\\-]?[1-9]\\d*)(\\.\\d{2})$");

    
    /*********************************************************************************************************************************************/
    //字符相关
    /*********************************************************************************************************************************************/
    
    /** 字母 */
    public static final Pattern ALPHABAT                     = Pattern.compile("^[A-Za-z]+$");

    /** 大写字母 */
    public static final Pattern ALPHABAT_UPPER               = Pattern.compile("^[A-Z]+$");

    /** 小写字母 */
    public static final Pattern ALPHABAT_LOWER               = Pattern.compile("^[a-z]+$");

    /** 小写字母或数字 */
    public static final Pattern ALPHA_LOWER_NUMERIC          = Pattern.compile("^[a-z0-9]+$");

    /** 大写字母或数字 */
    public static final Pattern ALPHA_UPPER_NUMERIC          = Pattern.compile("^[A-Z0-9]+$");

    /** 大写小字母和数字 */
    public static final Pattern ALPHA_NUMERIC                = Pattern.compile("^[A-Za-z0-9]+$");

    /** 大写小字母和数字，字母开头 */
    public static final Pattern ALPHA_NUMERIC_PA             = Pattern.compile("^[A-Za-z][A-Za-z0-9]*$");


    /** 字母，数字或下划线 */
    public static final Pattern ALPHA_NUMERIC_UL             = Pattern.compile("^[A-Za-z0-9_]+$");

    /** 大写小字母和数字，字母或下划线开头，java变量和方法命名 */
    public static final Pattern ALPHA_NUMERIC_UL_PA          = Pattern.compile("^[A-Za-z_][A-Za-z0-9_]*$");

    /** 大写小字母和数字，字母或下划线或$开头，js变量和方法命名 */
    public static final Pattern ALPHA_NUMERIC_UL_DL_PA       = Pattern.compile("^[A-Za-z_$][A-Za-z0-9_$]*$");

    /** 字母，数字或点号，如版本号V1.0.0 */
    public static final Pattern ALPHA_NUMERIC_DOT            = Pattern.compile("^[A-Za-z0-9.]+$");

    /** 字母，数字或.-_~（URL支持的四个字符） */
    public static final Pattern ALPHA_NUMERIC_URL            = Pattern.compile("^[A-Za-z0-9.\\-_~]+$");

    /** 双字节 */
    public static final Pattern ALPHABAT_DOUBLE              = Pattern.compile("^[^x00-xff]+$");

    /** 中文 */
    public static final Pattern CHINESE                      = Pattern.compile("^[\u4e00-\u9fa5]+$");

    /** 中文大小写字母和数字 */
    public static final Pattern CHINESE_ALPHA_NUMERIC        = Pattern.compile("^[\u4e00-\u9fa5A-Za-z0-9]+$");

    
    /** 十六进制字符 */
    public static final Pattern HEX                          = Pattern.compile("^[A-Fa-f0-9]+$");

    /** 32位十六进制字符 */
    public static final Pattern MD5                          = Pattern.compile("^[A-Fa-f0-9]{32}$");

    /** 账号和密码支持的特殊符号共10个[._-`~!@#$%]，账号要求2-16位字母数字或中文开头，密码要求6-16位的大小写字母数字和特殊符号满足四选三 */
    public static final Pattern USER_CODE                    = Pattern.compile("^[a-zA-Z0-9\\u4e00-\\u9fa5][._\\-`~!@#$%a-zA-Z0-9\\u4e00-\\u9fa5]{1,15}$");
    public static final Pattern USER_PASS                    = Pattern.compile("^(?:(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])|(?=.*[A-Z])(?=.*[a-z])(?=.*[._\\-`~!@#$%])|(?=.*[A-Z])(?=.*[0-9])(?=.*[._\\-`~!@#$%])|(?=.*[a-z])(?=.*[0-9])(?=.*[._\\-`~!@#$%])).{6,16}$");
    
    /*********************************************************************************************************************************************/
    //需求表达式
    /*********************************************************************************************************************************************/
    
    public static final Pattern MOBILE                       = Pattern.compile("^((\\+86)|(86)|)?1[1-9][0-9]\\d{8}$");
    public static final Pattern MOBILE_11                    = Pattern.compile("^1[1-9][0-9]\\d{8}$");
    public static final Pattern IP                           = Pattern.compile("^((?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])\\.){3}(?:[01]?\\d{1,2}|2[0-4]\\d|25[0-5])$");
    public static final Pattern MAC                          = Pattern.compile("^[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}:[0-9A-Fa-f]{2}$");
    public static final Pattern POSTAL_CODE                  = Pattern.compile("^[1-9]\\d{5}$");
    public static final Pattern EMAIL                        = Pattern.compile("^([\\w-_]+(?:\\.[\\w-_]+)*)@((?:[a-z0-9]+(?:-[a-zA-Z0-9]+)*)+\\.[a-z]{2,6})$");
    public static final Pattern FILE_NAME                    = Pattern.compile("(?!((^(?i)con$)|(^(?i)con\\..*)|(^(?i)prn$)|(^(?i)prn\\..*)|(^(?i)aux$)|(^(?i)aux\\..)|(^(?i)nul$)|(^(?i)nul\\..*)|(^(?i)com[0-9]$)|(^(?i)com[0-9]\\..*)|(^(?i)lpt[0-9]$)|(^(?i)lpt[0-9]\\..*)|(^\\s+)|(.*\\s$)|(^\\.$)))(^[^\\\\/\\:\\*\\?\\\"\\<\\>\\|]{1,255}$)");
    
    public static final Pattern DATE                         = Pattern.compile("^(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)$");
    public static final Pattern TIME                         = Pattern.compile("^([0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$");
    public static final Pattern DATE_TIME                    = Pattern.compile("^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s(([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9]))$");
    public static final Pattern IDCARD                       = Pattern.compile("^(\\d{6})((((19|20)[0-9]{2})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))(\\d{3}[0-9xX*])$");
    
    /**
     * 生日
     */
    public static final Pattern BIRTHDAY                     = Pattern.compile("^(\\d{2,4})([/\\-.年]?)(\\d{1,2})([/\\-.月]?)(\\d{1,2})日?$");
    
    
    /**
     * 统一社会信用代码
     * <pre>
     * 第一部分：登记管理部门代码1位 (数字或大写英文字母)
     * 第二部分：机构类别代码1位 (数字或大写英文字母)
     * 第三部分：登记管理机关行政区划码6位 (数字)
     * 第四部分：主体标识码（组织机构代码）9位 (数字或大写英文字母)
     * 第五部分：校验码1位 (数字或大写英文字母)
     * </pre>
     */
    public static final Pattern  CREDIT_CODE                 = Pattern.compile("^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$");
    /**
     * 车架号
     * 别名：车辆识别代号 车辆识别码
     * eg:LDC613P23A1305189
     * eg:LSJA24U62JG269225
     * 十七位码、车架号
     * 车辆的唯一标示
     */
    public static final Pattern  CAR_VIN                     = Pattern.compile("^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$");
    /**
     * 驾驶证  别名：驾驶证档案编号、行驶证编号
     * eg:430101758218
     * 12位数字字符串
     * 仅限：中国驾驶证档案编号
     */
    public static final Pattern  CAR_DRIVING_LICENCE         = Pattern.compile("^[0-9]{12}$");
    
    /*********************************************************************************************************************************************/
    //表情符号
    /*********************************************************************************************************************************************/
    
    public static final String SYMBOLS_UNICODE              = "[\u2300-\u23FF]|" //杂项工业符号 (Miscellaneous Technical)
                                                            + "[\u2600-\u27FF]|" //杂项符号 (Miscellaneous Symbols)
                                                            + "[\u2B00-\u2BFF]|" //杂项符号和箭头 (Miscellaneous Symbols and Arrows)
                                                            + "[\uFE00-\uFE0F]"; //变量选择符 (Variation Selector)
   
    public static final String SYMBOLS_EMOJI_IOS            = "[\uD83C\uDC00-\uD83C\uDFFF]|"
                                                            + "[\uD83D\uDC00-\uD83D\uDFFF]|"
                                                            + "[\uD83E\uDC00-\uD83E\uDFFF]|"
                                                            + "[\uD800\uDC00-\uDBFF\uDFFF]";//全部的D800-DBFF,DC00-DFFF
    
    public static final String SYMBOLS_ALL                  = SYMBOLS_UNICODE + "|" + SYMBOLS_EMOJI_IOS;
}
